﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
//内部类是定义在另一个类内部的类，具有以下特性：
//1.存储独立​​：内部类对象与外部类对象相互独立，不共享存储空间。
//2.作用域与访问控制​​：内部类受外部类的访问限定符限制，可通过外部类::内部类访问。
//3.天然友元​​：内部类默认是外部类的友元，可直接访问外部类的私有/保护成员；
//  但外部类却不算是内部类的友元，即不能直接访问内部类的保护/私有成员


////内部类独立存储及访问限定受限：
//class A
//{
//public:
//	A()
//		:_a1(1)
//		,_a2(1)
//	{	
//	}
//	class B
//	{
//	public:
//		B(int b = 1)
//		{
//			_b = b;
//		}
//	private:
//		int _b;
//	};
//private:
//	int _a1;
//	int _a2;
//	class C
//	{
//	public:
//		C(int c = 1)
//		{
//			_c = c;
//		}
//	private:
//		int _c;
//	};
//};
//
//int main()
//{
//	std::cout << sizeof(A) << std::endl;//8->正好是A的两个成员变量的字节数，所以，外部类A的内存中不存放内部类B
//	std::cout << sizeof(A::B) << std::endl;//4->可以通过A::B的方式来找到内部类
//	//std::cout << sizeof(A::C) << std::endl;//C不可访问->类A外不能直接访问A的私有内部类
//	return 0;
//}


////外部类不可直接访问内部类的私有/保护成员
//class A
//{
//public:
//	A()
//		:_a(1)
//		, s(1)
//	{
//		s._b1 = 2;//->A可以通过创建B类示例来访问其公有成员
//		//s._b2;//已声明，不可访问->可以观察到，外部类A是不能直接访问内部类的私有成员的
//	}
//	class B
//	{
//	public:
//		B(int b = 1)
//		{
//			_b1 = _b2 = b;
//		}
//		int _b1;
//	private:
//		int _b2;
//	};
//private:
//	int _a;
//	B s;//若想通过外部类访问内部类成员，就要先有内部类示例，然后通过实例去访问
//};


//内部类是外部类的友元类
class A
{
public:
	A()
		:_a(1)
	{
	}
	class B
	{
	public:
		B(int b = 1)
		{
			_b = b;
		}
		void Print(const A& a);
	private:
		int _b;
	};
private:
	int _a;
};

void A::B::Print(const A& a)
{
	std::cout << a._a << std::endl;//可以看到，Print函数作为内部类B的成员函数，可以访问外部类A的私有成员
}
int main()
{
	A s;
	A::B t;
	t.Print(s);//1
	return 0;
}
